package com.jiangyg.mall.admin.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.jiangyg.mall.authz.UserInfoHolder;
import com.jiangyg.mall.core.utils.Logger;
import com.jiangyg.mall.db.MyBatisConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

/**
 * 类描述：后台管理配置
 *
 * @author jiangyg
 * @date 2022-01-12
 */
@Configuration
public class AdminConfiguration {

    /**
     * 功能描述：后台管理自定义字段填充器
     *
     * @return 结果
     */
    @Bean(MyBatisConstant.META_OBJECT_HANDLER_NAME)
    public AdminMetaObjectHandler adminMetaObjectHandler() {
        return new AdminMetaObjectHandler();
    }

    /**
     * 类描述：项目默认自定填充器
     *
     * @author jiangyg
     * @version 4.0
     * @date 2021-10-09
     */
    @Slf4j
    public static class AdminMetaObjectHandler implements MetaObjectHandler {

        @Override
        public void insertFill(MetaObject metaObject) {
            // 如果没有获取到当前用户信息，则不处理
            final Long loginUserId = UserInfoHolder.loginUserId();
            if (loginUserId == null) {
                Logger.warn(log, () -> String.format("实体[%s]新增数据警告：未获取到当前线程登录用户的信息！",
                        metaObject.getOriginalObject().getClass().getSimpleName()));
                return;
            }
            // 如果实体存在createUserId字段，则自动填充createUserId和createTime字段
            if (metaObject.hasSetter("createUserId")) {
                this.setFieldValByName("createTime", new Date(), metaObject);
                this.setFieldValByName("createUserId", loginUserId, metaObject);
            }
        }

        @Override
        public void updateFill(MetaObject metaObject) {
            // 如果没有获取到当前用户信息，则不处理
            final Long loginUserId = UserInfoHolder.loginUserId();
            if (loginUserId == null) {
                Logger.warn(log, () -> String.format("实体[%s]修改数据警告：未获取到当前线程登录用户的信息！",
                        metaObject.getOriginalObject().getClass().getSimpleName()));
                return;
            }
            // 如果实体存在updateUserId字段，则自动填充updateUserId和updateTime字段
            if (metaObject.hasSetter("updateUserId")) {
                this.setFieldValByName("updateTime", new Date(), metaObject);
                this.setFieldValByName("updateUserId", loginUserId, metaObject);
            }
        }

    }

}
